add support for cmake build options (#809)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Tue, 4 Jan 2022 20:19:56 +0000 (13:19 -0700)
committerGitHub <noreply@github.com>
Tue, 4 Jan 2022 20:19:56 +0000 (13:19 -0700)
* add initial support for cmake build options.

including basic library configuration.
Unlike our qmake build it generates and links with static libraries if
we are using our internally supplied copies.  The configuration options
are not as sophisticated as in our qmake build.  The configuration of
zlib will likely be acceptable as cmake provides support via findZLIB.
The configuration of shapelib and libusb-1.0 likely will likely need to
be enhanced.

* fix typo

* mimic qmake library searches.

too much energy went into verification with packagers that the
qmake options were sufficient for their needs.

* tweak library searches

CMakeLists.txt
gui/CMakeLists.txt
jeeps/gpslibusb.cc
libusb.cmake [new file with mode: 0644]
shapelib.cmake [new file with mode: 0644]
zlib.cmake [new file with mode: 0644]

index 25eeb6fddee4654c6ced1b63afce9c4952265cb5..29eed049978e1f7cb88af22aad5cb2f6aacf7367 100644 (file)
@@ -1,5 +1,8 @@
 cmake_minimum_required(VERSION 3.11)
 
+include(CMakeDependentOption)
+include(CheckIncludeFile)
+
 include(gbversion.cmake)
 project(gpsbabel LANGUAGES C CXX VERSION ${GB.VERSION})
 
@@ -152,32 +155,6 @@ set(FILTERS
   validate.cc
 )
 
-# SHAPE
-set(SHAPE
-  shapelib/dbfopen.c
-  shapelib/safileio.c
-  shapelib/shpopen.c
-)
-
-# ZLIB
-set(ZLIB
-  zlib/adler32.c
-  zlib/compress.c
-  zlib/crc32.c
-  zlib/deflate.c
-  zlib/gzclose.c
-  zlib/gzlib.c
-  zlib/gzread.c
-  zlib/gzwrite.c
-  zlib/infback.c
-  zlib/inffast.c
-  zlib/inflate.c
-  zlib/inftrees.c
-  zlib/trees.c
-  zlib/uncompr.c
-  zlib/zutil.c
-)
-
 # JEEPS
 set(JEEPS
   jeeps/gpsapp.cc
@@ -310,20 +287,6 @@ set(HEADERS
   src/core/vector3d.h
   src/core/xmlstreamwriter.h
   src/core/xmltag.h
-
-  shapelib/shapefil.h
-
-  zlib/crc32.h
-  zlib/deflate.h
-  zlib/gzguts.h
-  zlib/inffast.h
-  zlib/inffixed.h
-  zlib/inflate.h
-  zlib/inftrees.h
-  zlib/trees.h
-  zlib/zconf.h
-  zlib/zlib.h
-  zlib/zutil.h
 )
 if(${QT_VERSION_MAJOR} EQUAL "6")
   set(HEADERS ${HEADERS} src/core/codecdevice.h)
@@ -332,24 +295,9 @@ endif()
 string(REPLACE .cc .h FILTER_HEADERS "${FILTERS}")
 set(HEADERS ${HEADERS} ${FILTER_HEADERS})
 
-target_include_directories(gpsbabel PRIVATE zlib)
-
-include(CheckIncludeFile)
 if(UNIX)
-  # this is used by zlib
-  check_include_file("unistd.h" HAVE_UNISTD_H)
-  if(${HAVE_UNISTD_H})
-    target_compile_definitions(gpsbabel PRIVATE HAVE_UNISTD_H)
-  endif()
-  # this is used by zlib
-  check_include_file("stdarg.h" HAVE_STDARG_H)
-  if(${HAVE_STDARG_H})
-    target_compile_definitions(gpsbabel PRIVATE HAVE_STDARG_H)
-  endif()
-  target_compile_definitions(gpsbabel PRIVATE HAVE_LIBUSB_1_0)
   set(SOURCES ${SOURCES} gbser_posix.cc)
   set(HEADERS ${HEADERS} gbser_posix.h)
-  set(JEEPS ${JEEPS} jeeps/gpslibusb.cc)
   target_compile_options(gpsbabel PRIVATE -Wall)
 endif()
 
@@ -373,37 +321,19 @@ if(MSVC)
   target_compile_options(gpsbabel PRIVATE /MP -wd4100 -wd4267)
 endif()
 
-if(UNIX AND NOT APPLE)
-  set(LIBS ${LIBS} usb-1.0)
-endif()
-
 if(APPLE)
-  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lobjc -framework IOKit -framework CoreFoundation")
-  target_include_directories(gpsbabel PRIVATE mac/libusb mac/libusb/Xcode)
-  set(SOURCES ${SOURCES}
-    mac/libusb/core.c
-    mac/libusb/descriptor.c
-    mac/libusb/hotplug.c
-    mac/libusb/io.c
-    mac/libusb/strerror.c
-    mac/libusb/sync.c
-    mac/libusb/os/darwin_usb.c
-    mac/libusb/os/events_posix.c
-    mac/libusb/os/threads_posix.c
-  )
-  set(HEADERS ${HEADERS}
-    mac/libusb/hotplug.h
-    mac/libusb/libusb.h
-    mac/libusb/libusbi.h
-    mac/libusb/version.h
-    mac/libusb/version_nano.h
-    mac/libusb/os/darwin_usb.h
-    mac/libusb/os/events_posix.h
-    mac/libusb/os/threads_posix.h
-  )
   target_compile_options(gpsbabel PRIVATE -Wall -Wsign-compare)
 endif()
 
+include(shapelib.cmake)
+include(zlib.cmake)
+include(libusb.cmake)
+
+set(GPSBABEL_EXTRA_LINK_LIBRARIES "" CACHE STRING "extra libraries to link with.")
+list(APPEND LIBS ${GPSBABEL_EXTRA_LINK_LIBRARIES})
+set(GPSBABEL_EXTRA_INCLUDE_DIRECTORIES "" CACHE STRING "extra directories to include.")
+target_include_directories(gpsbabel PRIVATE ${GPSBABEL_EXTRA_INCLUDE_DIRECTORIES})
+
 set(SOURCES
   ${SOURCES} ${ALL_FMTS} ${FILTERS} ${SUPPORT} ${SHAPE} ${ZLIB} ${JEEPS} ${RESOURCES}
 )
@@ -419,7 +349,7 @@ target_compile_definitions(gpsbabel PRIVATE FILTERS_ENABLED)
 target_compile_definitions(gpsbabel PRIVATE SHAPELIB_ENABLED)
 target_compile_definitions(gpsbabel PRIVATE CSVFMTS_ENABLED)
 
-target_link_libraries(gpsbabel ${QT_LIBRARIES} ${LIBS})
+target_link_libraries(gpsbabel PRIVATE ${QT_LIBRARIES} ${LIBS})
 
 get_target_property(Srcs gpsbabel SOURCES)
 message(STATUS "Sources are: \"${Srcs}\"")
index ad42f3b8372a456350b1334a1d467328992fac5b..4c839c23a25fc89d2840eb1c63b99616beb64346 100644 (file)
@@ -32,8 +32,8 @@ else()
   message(STATUS "Using Qt${QT_VERSION_MAJOR} version ${Qt${QT_VERSION_MAJOR}Core_VERSION}")
 endif()
 
-set(MAPPREVIEW ON CACHE BOOL "enable map preview")
-if (MAPPREVIEW)
+option(GPSBABEL_MAPPREVIEW "enable map preview." ON)
+if (GPSBABEL_MAPPREVIEW)
   find_package(Qt${QT_VERSION_MAJOR} COMPONENTS WebEngineWidgets WebChannel REQUIRED)
   list(APPEND QT_LIBRARIES Qt${QT_VERSION_MAJOR}::WebEngineWidgets Qt${QT_VERSION_MAJOR}::WebChannel)
 else()
@@ -55,7 +55,7 @@ list(APPEND FORMS aboutui.ui)
 list(APPEND FORMS advui.ui)
 list(APPEND FORMS donate.ui)
 list(APPEND FORMS filterui.ui)
-if (MAPPREVIEW)
+if (GPSBABEL_MAPPREVIEW)
   list(APPEND FORMS gmapui.ui)
 endif()
 list(APPEND FORMS mainwinui.ui)
@@ -77,7 +77,7 @@ list(APPEND SOURCES filterdlg.cc)
 list(APPEND SOURCES filterwidgets.cc)
 list(APPEND SOURCES format.cc)
 list(APPEND SOURCES formatload.cc)
-if (MAPPREVIEW)
+if (GPSBABEL_MAPPREVIEW)
   list(APPEND SOURCES gmapdlg.cc)
   list(APPEND SOURCES gpx.cc)
 endif()
@@ -85,7 +85,7 @@ list(APPEND SOURCES help.cc)
 list(APPEND SOURCES latlng.cc)
 list(APPEND SOURCES main.cc)
 list(APPEND SOURCES mainwindow.cc)
-if (MAPPREVIEW)
+if (GPSBABEL_MAPPREVIEW)
   list(APPEND SOURCES map.cc)
 endif()
 list(APPEND SOURCES optionsdlg.cc)
@@ -112,13 +112,13 @@ list(APPEND HEADERS filterdlg.h)
 list(APPEND HEADERS filterwidgets.h)
 list(APPEND HEADERS format.h)
 list(APPEND HEADERS formatload.h)
-if (MAPPREVIEW)
+if (GPSBABEL_MAPPREVIEW)
   list(APPEND HEADERS gmapdlg.h)
   list(APPEND HEADERS gpx.h)
 endif()
 list(APPEND HEADERS help.h)
 list(APPEND HEADERS mainwindow.h)
-if (MAPPREVIEW)
+if (GPSBABEL_MAPPREVIEW)
   list(APPEND HEADERS map.h)
 endif()
 list(APPEND HEADERS optionsdlg.h)
@@ -130,16 +130,16 @@ list(APPEND HEADERS upgrade.h)
 list(APPEND HEADERS version_mismatch.h)
 
 if(UNIX AND NOT APPLE)
-  set(EMBED_TRANSLATIONS ON CACHE BOOL "embed translations")
-  set(EMBED_MAP ON CACHE BOOL "embed map html")
+  option(GPSBABEL_EMBED_TRANSLATIONS "embed translations." ON)
+  cmake_dependent_option(GPSBABEL_EMBED_MAP "embed gmapbase.html for map preview." ON "GPSBABEL_MAPPREVIEW" OFF)
 else()
-  set(EMBED_TRANSLATIONS OFF CACHE BOOL "embed translations")
-  set(EMBED_MAP OFF CACHE BOOL "embed map html")
+  option(GPSBABEL_EMBED_TRANSLATIONS "embed translations." OFF)
+  cmake_dependent_option(GPSBABEL_EMBED_MAP "embed gmapbase.html for map preview." OFF "GPSBABEL_MAPPREVIEW" OFF)
 endif()
-if (EMBED_TRANSLATIONS)
+if (GPSBABEL_EMBED_TRANSLATIONS)
   list(APPEND RESOURCES translations.qrc)
 endif()
-if (EMBED_MAP)
+if (GPSBABEL_EMBED_MAP)
   list(APPEND RESOURCES map.qrc)
 endif()
 
index 4207288313528d10c05cdac3e59289bd2cb48e27..ba04068059c580d6caf3f64eeceb10b48dd59cd9 100644 (file)
 //          produced project file is invalid.  However, we don't use libusb
 //          at all on windows, so this isn't an issue in this application.
 #  include LIBUSB_H_INCLUDE
-#else  // TODO: delete this clause when configure is removed and CMakeLists updated.
-#  if __APPLE__
-// We use our own libusb.
-#    include "mac/libusb/libusb.h"
-#  else
-#    include <libusb-1.0/libusb.h>
-#  endif
 #endif
 #include "defs.h"
 #include "jeeps/garminusb.h"
diff --git a/libusb.cmake b/libusb.cmake
new file mode 100644 (file)
index 0000000..e186a6b
--- /dev/null
@@ -0,0 +1,67 @@
+if(UNIX)
+  if (NOT APPLE)
+    set(GPSBABEL_WITH_LIBUSB "system" CACHE STRING "no|pkgconfig|system*|custom")
+  else()
+    set(GPSBABEL_WITH_LIBUSB "included" CACHE STRING "no|pkgconfig|included*|custom")
+  endif()
+  if(GPSBABEL_WITH_LIBUSB STREQUAL "no")
+    message(STATUS "libusb-1.0 disabled.")
+    list(APPEND JEEPS jeeps/gpsusbstub.cc)
+  else()
+    target_compile_definitions(gpsbabel PRIVATE HAVE_LIBUSB_1_0)
+    list(APPEND JEEPS jeeps/gpslibusb.cc)
+    if(GPSBABEL_WITH_LIBUSB STREQUAL "pkgconfig")
+      message(STATUS "Using libusb-1.0 found by pkg-config.")
+      find_package(PkgConfig REQUIRED)
+      pkg_search_module(LIBUSB REQUIRED libusb-1.0 IMPORTED_TARGET)
+      list(APPEND LIBS PkgConfig::LIBUSB)
+      target_compile_definitions(gpsbabel PRIVATE LIBUSB_H_INCLUDE=<libusb.h>)
+    else()
+      if(UNIX AND NOT APPLE)
+        if(GPSBABEL_WITH_LIBUSB STREQUAL "system")
+          list(APPEND LIBS usb-1.0)
+          target_compile_definitions(gpsbabel PRIVATE LIBUSB_H_INCLUDE=<libusb-1.0/libusb.h>)
+        elseif(GPSBABEL_WITH_LIBUSB STREQUAL "custom")
+          message("libusb-1.0 is enabled but but must be manually configured.")
+          message("  e.g. GPSBABEL_WITH_LIBUSB=custom GPSBABEL_EXTRA_LINK_LIBRARIES:STRING==... GPSBABEL_EXTRA_INCLUDE_DIRECTORIES:STRING=...")
+          target_compile_definitions(gpsbabel PRIVATE LIBUSB_H_INCLUDE=<libusb.h>)
+        else()
+          message(FATAL_ERROR "GPSBABEL_WITH_LIBUSB=no|pkgconfig|system*|custom")
+        endif()
+      else()
+        if(GPSBABEL_WITH_LIBUSB STREQUAL "included")
+          target_compile_definitions(gpsbabel PRIVATE "LIBUSB_H_INCLUDE=\"mac/libusb/libusb.h\"")
+          add_library(usb-1.0 STATIC
+            mac/libusb/core.c
+            mac/libusb/descriptor.c
+            mac/libusb/hotplug.c
+            mac/libusb/io.c
+            mac/libusb/strerror.c
+            mac/libusb/sync.c
+            mac/libusb/os/darwin_usb.c
+            mac/libusb/os/events_posix.c
+            mac/libusb/os/threads_posix.c
+            mac/libusb/hotplug.h
+            mac/libusb/libusb.h
+            mac/libusb/libusbi.h
+            mac/libusb/version.h
+            mac/libusb/version_nano.h
+            mac/libusb/os/darwin_usb.h
+            mac/libusb/os/events_posix.h
+            mac/libusb/os/threads_posix.h
+            mac/libusb/XCode/config.h
+          )
+          target_include_directories(usb-1.0 PRIVATE mac/libusb/XCode PUBLIC mac/libusb)
+          target_link_libraries(usb-1.0 INTERFACE objc "-framework IOKit" "-framework CoreFoundation")
+          list(APPEND LIBS usb-1.0)
+        elseif(GPSBABEL_WITH_LIBUSB STREQUAL "custom")
+          message("libusb-1.0 is enabled but but must be manually configured.")
+          message("  e.g. GPSBABEL_WITH_LIBUSB=custom GPSBABEL_EXTRA_LINK_LIBRARIES:STRING==... GPSBABEL_EXTRA_INCLUDE_DIRECTORIES:STRING=...")
+          target_compile_definitions(gpsbabel PRIVATE LIBUSB_H_INCLUDE=<libusb.h>)
+        else()
+          message(FATAL_ERROR "GPSBABEL_WITH_LIBUSB=no|pkgconfig|included*|custom")
+        endif()
+      endif()
+    endif()
+  endif()
+endif()
diff --git a/shapelib.cmake b/shapelib.cmake
new file mode 100644 (file)
index 0000000..0d53c71
--- /dev/null
@@ -0,0 +1,30 @@
+set(GPSBABEL_WITH_SHAPELIB "included" CACHE STRING "no|pkgconfig|included*|custom.")
+if(GPSBABEL_WITH_SHAPELIB STREQUAL "no")
+  message(STATUS "shapelib disabled.")
+else()
+  target_compile_definitions(gpsbabel PRIVATE SHAPELIB_ENABLED)
+  if(GPSBABEL_WITH_SHAPELIB STREQUAL "pkgconfig")
+    message(STATUS "Using shapelib found by pkg-config.")
+    find_package(PkgConfig REQUIRED)
+    pkg_search_module(SHAPELIB REQUIRED shapelib IMPORTED_TARGET)
+    list(APPEND LIBS PkgConfig::SHAPELIB)
+    target_compile_definitions(gpsbabel PRIVATE HAVE_LIBSHAPE)
+  elseif(GPSBABEL_WITH_SHAPELIB STREQUAL "included")
+    add_library(shp STATIC
+      shapelib/dbfopen.c
+      shapelib/safileio.c
+      shapelib/shpopen.c
+      shapelib/shapefil.h
+    )
+    # note gpsbabel has conditional code include "shapelib/shapefil.h",
+    # so it doesn't actually rely on the include directory being PUBLIC/INTERFACE
+    target_include_directories(shp PUBLIC shape)
+    list(APPEND LIBS shp)
+  elseif(GPSBABEL_WITH_SHAPELIB STREQUAL "custom")
+    message(STATUS "shapelib is enabled but but must be manually configured.")
+    message(STATUS "  e.g. -DGPSBABEL_WITH_SHAPELIB:STRING=custom -DGPSBABEL_EXTRA_LINK_DIRECTORIES:STRING=... -DGPSBABEL_EXTRA_INCLUDE_DIRECTORIES:STRING=...")
+    target_compile_definitions(gpsbabel PRIVATE HAVE_LIBSHAPE)
+  else()
+    message(FATAL_ERROR "GPSBABEL_WITH_SHAPELIB=no|pkgconfig|included*|custom")
+  endif()
+endif()
diff --git a/zlib.cmake b/zlib.cmake
new file mode 100644 (file)
index 0000000..c32100a
--- /dev/null
@@ -0,0 +1,66 @@
+set(GPSBABEL_WITH_ZLIB "included" CACHE STRING "no|findpackage|pkgconfig|included*|custom.")
+if(GPSBABEL_WITH_ZLIB STREQUAL "no")
+  message(STATUS "zlib disabled")
+  target_compile_definitions(gpsbabel PRIVATE ZLIB_INHIBITED)
+else()
+  if(GPSBABEL_WITH_ZLIB STREQUAL "findpackage")
+    find_package(ZLIB 1.2.9 REQUIRED)
+    list(APPEND LIBS ZLIB::ZLIB)
+    target_compile_definitions(gpsbabel PRIVATE HAVE_LIBZ)
+  elseif(GPSBABEL_WITH_ZLIB STREQUAL "pkgconfig")
+    message("Using zlib found by pkg-config")
+    find_package(PkgConfig REQUIRED)
+    pkg_search_module(ZLIB REQUIRED zlib>=1.2.9 IMPORTED_TARGET)
+    list(APPEND LIBS PkgConfig::ZLIB)
+    target_compile_definitions(gpsbabel PRIVATE HAVE_LIBZ)
+  elseif(GPSBABEL_WITH_ZLIB STREQUAL "included")
+    add_library(z STATIC
+      zlib/adler32.c
+      zlib/compress.c
+      zlib/crc32.c
+      zlib/deflate.c
+      zlib/inffast.c
+      zlib/inflate.c
+      zlib/infback.c
+      zlib/inftrees.c
+      zlib/trees.c
+      zlib/uncompr.c
+      zlib/gzlib.c
+      zlib/gzclose.c
+      zlib/gzread.c
+      zlib/gzwrite.c
+      zlib/zutil.c
+      zlib/crc32.h
+      zlib/deflate.h
+      zlib/gzguts.h
+      zlib/inffast.h
+      zlib/inffixed.h
+      zlib/inflate.h
+      zlib/inftrees.h
+      zlib/trees.h
+      zlib/zconf.h
+      zlib/zlib.h
+      zlib/zutil.h
+    )
+    if(UNIX)
+      # this is used by zlib
+      check_include_file(unistd.h HAVE_UNISTD_H)
+      if(HAVE_UNISTD_H)
+        target_compile_definitions(z PRIVATE HAVE_UNISTD_H)
+      endif()
+      # this is used by zlib
+      check_include_file(stdarg.h HAVE_STDARG_H)
+      if(HAVE_STDARG_H)
+        target_compile_definitions(z PRIVATE HAVE_STDARG_H)
+      endif()
+    endif()
+    target_include_directories(z PUBLIC zlib)
+    list(APPEND LIBS z)
+  elseif(GPSBABEL_WITH_ZLIB STREQUAL "custom")
+    message("zlib is enabled but but must be manually configured.")
+    message("  e.g. GPSBABEL_WITH_ZLIB=custom GPSBABEL_EXTRA_LINK_LIBRARIES:STRING==... GPSBABEL_EXTRA_INCLUDE_DIRECTORIES:STRING=...")
+    target_compile_definitions(gpsbabel PRIVATE HAVE_LIBZ)
+  else()
+    message(FATAL_ERROR "GPSBABEL_WITH_ZLIB=no|findpackage|pkgconfig|included*|custom")
+  endif()
+endif()